package br.org.game.mthread;
import java.applet.Applet;
import java.awt.Event;
import java.awt.Label;
import java.awt.TextArea;
import java.awt.TextField;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.net.Socket;

public class ClienteCall extends Applet {

	public static final int DEFAULT_PORT = 4321;
	public Socket socketClient;
	private Thread reader;
	public TextArea outputArea;
	public TextField inputArea, nomefield;
	public PrintStream out;
	public String name;

	// Cria as linhas de leitura e escrita e as inicia.
	@Override
	public void init() {
		outputArea = new TextArea(20, 45);
		inputArea = new TextField(45);
		nomefield = new TextField(10);

		// Tela da Applet
		add(new Label("MiniChat usando conexao (Socket TCP)"));
		add(new Label("Nome do usuario"));
		add(nomefield);
		add(outputArea);
		add(new Label("Digite uma mensagem e pressione ENTER"));
		add(inputArea);
		resize(350, 445);
		try {
			// Cria um socket cliente passando o endereco e a porta do servidor
			socketClient = new Socket("127.0.0.1", DEFAULT_PORT);
			reader = new Reader(this, outputArea);
			out = new PrintStream(socketClient.getOutputStream());
			// Define prioridades desiguais para que o console seja compartilhado
			// de forma efetiva.
			reader.setPriority(3);
			reader.start();
		} catch (IOException e) {
			System.err.println(e);
		}
	}

	@Override
	public boolean handleEvent(Event evt) {
		if (evt.target == inputArea) {
			char c = (char) evt.key;
			if (c == '\n')
			// Vigia se o usuario pressiona a tecla ENTER.
			// Isso permite saber a mensagem esta pronta para ser enviada!
			{
				String line = inputArea.getText();
				name = nomefield.getText();
				out.println(name + ">" + line);
				inputArea.setText("");
				// Envia a mensagem, mas adiciona o nome do usuario a ela para que os
				// outros clientes saibam quem a enviou.
				return true;
			}
		}
		return false;
	}
}

// ----------------------------------------------------------------------------
// A classe Reader le a entrada do soquete e atualiza a OutputArea com as novas mensagens.
class Reader extends Thread {

	private ClienteCall cliente;
	private TextArea outputArea;

	public Reader(ClienteCall c, TextArea OutputArea) {
		super("ChatClient Reader");
		this.cliente = c;
		this.outputArea = OutputArea;
	}

	@SuppressWarnings("deprecation")
	@Override
	public void run() {
		try {
			DataInputStream in = new DataInputStream(cliente.socketClient.getInputStream());
			while (true) {
				String line = in.readLine();
				// Adiciona a nova mensagem a OutputArea
				outputArea.appendText(line + "\r\n");
			}
		} catch (IOException e) {
			System.out.println("Reader:" + e);
		}
	}

}
